home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / shockab.zip / DOG.QC < prev    next >
Text File  |  1996-10-09  |  12KB  |  382 lines

  1. /*
  2. ==============================================================================
  3.  
  4. DOG
  5.  
  6. ==============================================================================
  7. */
  8. $cd /raid/quake/id1/models/dog
  9. $origin 0 0 24
  10. $base base
  11. $skin skin
  12.  
  13. $frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8
  14.  
  15. $frame death1 death2 death3 death4 death5 death6 death7 death8 death9
  16.  
  17. $frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
  18. $frame deathb9
  19.  
  20. $frame pain1 pain2 pain3 pain4 pain5 pain6
  21.  
  22. $frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10
  23. $frame painb11 painb12 painb13 painb14 painb15 painb16
  24.  
  25. $frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12
  26.  
  27. $frame leap1 leap2 leap3 leap4 leap5 leap6 leap7 leap8 leap9
  28.  
  29. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  30.  
  31. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8
  32.  
  33.  
  34. void() dog_leap1;
  35. void() dog_run1;
  36.  
  37. /*
  38. ================
  39. dog_bite
  40.  
  41. ================
  42. */
  43. void() dog_bite =
  44. {
  45. local vector      delta;
  46. local float       ldmg;
  47.  
  48.     if (!self.enemy)
  49.         return;
  50.  
  51.     ai_charge(10);
  52.  
  53.     if (!CanDamage (self.enemy, self))
  54.         return;
  55.  
  56.     delta = self.enemy.origin - self.origin;
  57.  
  58.     if (vlen(delta) > 100)
  59.         return;
  60.         
  61.     ldmg = (random() + random() + random()) * 8;
  62.     T_Damage (self.enemy, self, self, ldmg);
  63. };
  64.  
  65. void()      Dog_JumpTouch =
  66. {
  67.     local float ldmg;
  68.  
  69.     if (self.health <= 0)
  70.         return;
  71.         
  72.     if (other.takedamage)
  73.     {
  74.         if ( vlen(self.velocity) > 300 )
  75.         {
  76.             ldmg = 10 + 10*random();
  77.             T_Damage (other, self, self, ldmg); 
  78.         }
  79.     }
  80.  
  81.     if (!checkbottom(self))
  82.     {
  83.         if (self.flags & FL_ONGROUND)
  84.         {     // jump randomly to not get hung up
  85. //dprint ("popjump\n");
  86.     self.touch = SUB_Null;
  87.     self.think = dog_leap1;
  88.     self.nextthink = time + 0.1;
  89.  
  90. //                self.velocity_x = (random() - 0.5) * 600;
  91. //                self.velocity_y = (random() - 0.5) * 600;
  92. //                self.velocity_z = 200;
  93. //                self.flags = self.flags - FL_ONGROUND;
  94.         }
  95.         return;     // not on ground yet
  96.     }
  97.  
  98.     self.touch = SUB_Null;
  99.     self.think = dog_run1;
  100.     self.nextthink = time + 0.1;
  101. };
  102.  
  103.  
  104. void() dog_stand1 =[    $stand1,    dog_stand2  ] {ai_stand();};
  105. void() dog_stand2 =[    $stand2,    dog_stand3  ] {ai_stand();};
  106. void() dog_stand3 =[    $stand3,    dog_stand4  ] {ai_stand();};
  107. void() dog_stand4 =[    $stand4,    dog_stand5  ] {ai_stand();};
  108. void() dog_stand5 =[    $stand5,    dog_stand6  ] {ai_stand();};
  109. void() dog_stand6 =[    $stand6,    dog_stand7  ] {ai_stand();};
  110. void() dog_stand7 =[    $stand7,    dog_stand8  ] {ai_stand();};
  111. void() dog_stand8 =[    $stand8,    dog_stand9  ] {ai_stand();};
  112. void() dog_stand9 =[    $stand9,    dog_stand1  ] {ai_stand();};
  113.  
  114. void() dog_walk1  =[    $walk1 ,    dog_walk2   ] {
  115. if (random() < 0.2)
  116.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  117. ai_walk(8);};
  118. void() dog_walk2  =[    $walk2 ,    dog_walk3   ] {ai_walk(8);};
  119. void() dog_walk3  =[    $walk3 ,    dog_walk4   ] {ai_walk(8);};
  120. void() dog_walk4  =[    $walk4 ,    dog_walk5   ] {ai_walk(8);};
  121. void() dog_walk5  =[    $walk5 ,    dog_walk6   ] {ai_walk(8);};
  122. void() dog_walk6  =[    $walk6 ,    dog_walk7   ] {ai_walk(8);};
  123. void() dog_walk7  =[    $walk7 ,    dog_walk8   ] {ai_walk(8);};
  124. void() dog_walk8  =[    $walk8 ,    dog_walk1   ] {ai_walk(8);};
  125.  
  126. void() dog_run1         =[    $run1  ,    dog_run2    ] {
  127. if (random() < 0.2)
  128.     sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE);
  129. ai_run(16);};
  130. void() dog_run2         =[    $run2  ,    dog_run3    ] {ai_run(32);};
  131. void() dog_run3         =[    $run3  ,    dog_run4    ] {ai_run(32);};
  132. void() dog_run4         =[    $run4  ,    dog_run5    ] {ai_run(20);};
  133. void() dog_run5         =[    $run5  ,    dog_run6    ] {ai_run(64);};
  134. void() dog_run6         =[    $run6  ,    dog_run7    ] {ai_run(32);};
  135. void() dog_run7         =[    $run7  ,    dog_run8    ] {ai_run(16);};
  136. void() dog_run8         =[    $run8  ,    dog_run9    ] {ai_run(32);};
  137. void() dog_run9         =[    $run9  ,    dog_run10   ] {ai_run(32);};
  138. void() dog_run10  =[    $run10  ,   dog_run11   ] {ai_run(20);};
  139. void() dog_run11  =[    $run11  ,   dog_run12   ] {ai_run(64);};
  140. void() dog_run12  =[    $run12  ,   dog_run1    ] {ai_run(32);};
  141.  
  142. void() dog_atta1  =[    $attack1,   dog_atta2   ] {ai_charge(10);};
  143. void() dog_atta2  =[    $attack2,   dog_atta3   ] {ai_charge(10);};
  144. void() dog_atta3  =[    $attack3,   dog_atta4   ] {ai_charge(10);};
  145. void() dog_atta4  =[    $attack4,   dog_atta5   ] {
  146. sound (self, CHAN_VOICE, "dog/dattack1.wav", 1, ATTN_NORM);
  147. dog_bite();};
  148. void() dog_atta5  =[    $attack5,   dog_atta6   ] {ai_charge(10);};
  149. void() dog_atta6  =[    $attack6,   dog_atta7   ] {ai_charge(10);};
  150. void() dog_atta7  =[    $attack7,   dog_atta8   ] {ai_charge(10);};
  151. void() dog_atta8  =[    $attack8,   dog_run1    ] {ai_charge(10);};
  152.  
  153. void() dog_leap1  =[    $leap1,           dog_leap2   ] {ai_face();};
  154. void() dog_leap2  =[    $leap2,           dog_leap3   ]
  155. {
  156.     ai_face();
  157.     
  158.     self.touch = Dog_JumpTouch;
  159.     makevectors (self.angles);
  160.     self.origin_z = self.origin_z + 1;
  161.     self.velocity = v_forward * 300 + '0 0 200';
  162.     if (self.flags & FL_ONGROUND)
  163.         self.flags = self.flags - FL_ONGROUND;
  164. };
  165.  
  166. void() dog_leap3  =[    $leap3,           dog_leap4   ] {};
  167. void() dog_leap4  =[    $leap4,           dog_leap5   ] {};
  168. void() dog_leap5  =[    $leap5,           dog_leap6   ] {};
  169. void() dog_leap6  =[    $leap6,           dog_leap7   ] {};
  170. void() dog_leap7  =[    $leap7,           dog_leap8   ] {};
  171. void() dog_leap8  =[    $leap8,           dog_leap9   ] {};
  172. void() dog_leap9  =[    $leap9,           dog_leap9   ] {};
  173.  
  174. void() dog_pain1  =[    $pain1 ,    dog_pain2   ] {};
  175. void() dog_pain2  =[    $pain2 ,    dog_pain3   ] {};
  176. void() dog_pain3  =[    $pain3 ,    dog_pain4   ] {};
  177. void() dog_pain4  =[    $pain4 ,    dog_pain5   ] {};
  178. void() dog_pain5  =[    $pain5 ,    dog_pain6   ] {};
  179. void() dog_pain6  =[    $pain6 ,    dog_run1    ] {};
  180.  
  181. void() dog_painb1 =[    $painb1 ,   dog_painb2  ] {};
  182. void() dog_painb2 =[    $painb2 ,   dog_painb3  ] {};
  183. void() dog_painb3 =[    $painb3 ,   dog_painb4  ] {ai_pain(4);};
  184. void() dog_painb4 =[    $painb4 ,   dog_painb5  ] {ai_pain(12);};
  185. void() dog_painb5 =[    $painb5 ,   dog_painb6  ] {ai_pain(12);};
  186. void() dog_painb6 =[    $painb6 ,   dog_painb7  ] {ai_pain(2);};
  187. void() dog_painb7 =[    $painb7 ,   dog_painb8  ] {};
  188. void() dog_painb8 =[    $painb8 ,   dog_painb9  ] {ai_pain(4);};
  189. void() dog_painb9 =[    $painb9 ,   dog_painb10 ] {};
  190. void() dog_painb10      =[    $painb10 ,  dog_painb11 ] {ai_pain(10);};
  191. void() dog_painb11      =[    $painb11 ,  dog_painb12 ] {};
  192. void() dog_painb12      =[    $painb12 ,  dog_painb13 ] {};
  193. void() dog_painb13      =[    $painb13 ,  dog_painb14 ] {};
  194. void() dog_painb14      =[    $painb14 ,  dog_painb15 ] {};
  195. void() dog_painb15      =[    $painb15 ,  dog_painb16 ] {};
  196. void() dog_painb16      =[    $painb16 ,  dog_run1    ] {};
  197.  
  198. void() dog_pain =
  199. {
  200.     sound (self, CHAN_VOICE, "dog/dpain1.wav", 1, ATTN_NORM);
  201.  
  202.     if (random() > 0.5)
  203.         dog_pain1 ();
  204.     else
  205.         dog_painb1 ();
  206. };
  207.  
  208. void() dog_die1         =[    $death1,    dog_die2    ] {};
  209. void() dog_die2         =[    $death2,    dog_die3    ] {};
  210. void() dog_die3         =[    $death3,    dog_die4    ] {};
  211. void() dog_die4         =[    $death4,    dog_die5    ] {};
  212. void() dog_die5         =[    $death5,    dog_die6    ] {};
  213. void() dog_die6         =[    $death6,    dog_die7    ] {};
  214. void() dog_die7         =[    $death7,    dog_die8    ] {};
  215. void() dog_die8         =[    $death8,    dog_die9    ] {};
  216. void() dog_die9         =[    $death9,    dog_die9    ] {};
  217.  
  218. void() dog_dieb1        =[    $deathb1,   dog_dieb2   ] {};
  219. void() dog_dieb2        =[    $deathb2,   dog_dieb3   ] {};
  220. void() dog_dieb3        =[    $deathb3,   dog_dieb4   ] {};
  221. void() dog_dieb4        =[    $deathb4,   dog_dieb5   ] {};
  222. void() dog_dieb5        =[    $deathb5,   dog_dieb6   ] {};
  223. void() dog_dieb6        =[    $deathb6,   dog_dieb7   ] {};
  224. void() dog_dieb7        =[    $deathb7,   dog_dieb8   ] {};
  225. void() dog_dieb8        =[    $deathb8,   dog_dieb9   ] {};
  226. void() dog_dieb9        =[    $deathb9,   dog_dieb9   ] {};
  227.  
  228.  
  229. void() dog_die =
  230. {
  231. // check for gib
  232.     if (self.health < -35)
  233.     {
  234.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  235.         ThrowGib ("progs/gib3.mdl", self.health);
  236.         ThrowGib ("progs/gib3.mdl", self.health);
  237.         ThrowGib ("progs/gib3.mdl", self.health);
  238.         ThrowHead ("progs/h_dog.mdl", self.health);
  239.         return;
  240.     }
  241.  
  242. // regular death
  243.     sound (self, CHAN_VOICE, "dog/ddeath.wav", 1, ATTN_NORM);
  244.     self.solid = SOLID_NOT;
  245.  
  246.     if (random() > 0.5)
  247.         dog_die1 ();
  248.     else
  249.         dog_dieb1 ();
  250. };
  251.  
  252. void() dog_fly1         =[    $death1,    dog_fly2    ] {
  253.     sound (self, CHAN_VOICE, "dog/dpain1.wav", 1, ATTN_NORM);
  254. };
  255. void() dog_fly2         =[    $death2,    dog_fly3    ] {};
  256. void() dog_fly3         =[    $death3,    dog_fly4    ] {};
  257. void() dog_fly4         =[    $death4,    dog_fly5    ] {};
  258. void() dog_fly5         =[    $death5,    dog_fly6    ] {};
  259. void() dog_fly6         =[    $death6,    dog_fly7    ] {};
  260. void() dog_fly7         =[    $death7,    dog_fly8    ] {};
  261. void() dog_fly8         =[    $death8,    dog_fly9    ] {};
  262. void() dog_fly9         =[    $death9,    dog_fly10   ] {self.nextthink = time + 0.2;};
  263. void() dog_fly10        =[    $death6,    dog_fly11   ] {};
  264. void() dog_fly11        =[    $death4,    dog_fly12   ] {};
  265. void() dog_fly12        =[    $death2,    dog_fly13   ] {};
  266. void() dog_fly13        =[    $death1,    dog_run1    ] {};
  267.  
  268. //============================================================================
  269.  
  270. /*
  271. ==============
  272. CheckDogMelee
  273.  
  274. Returns TRUE if a melee attack would hit right now
  275. ==============
  276. */
  277. float()     CheckDogMelee =
  278. {
  279.     if (enemy_range == RANGE_MELEE)
  280.     {     // FIXME: check canreach
  281.         self.attack_state = AS_MELEE;
  282.         return TRUE;
  283.     }
  284.     return FALSE;
  285. };
  286.  
  287. /*
  288. ==============
  289. CheckDogJump
  290.  
  291. ==============
  292. */
  293. float()     CheckDogJump =
  294. {
  295.     local vector      dist;
  296.     local float d;
  297.  
  298.     if (self.origin_z + self.mins_z > self.enemy.origin_z + self.enemy.mins_z
  299.     + 0.75 * self.enemy.size_z)
  300.         return FALSE;
  301.         
  302.     if (self.origin_z + self.maxs_z < self.enemy.origin_z + self.enemy.mins_z
  303.     + 0.25 * self.enemy.size_z)
  304.         return FALSE;
  305.         
  306.     dist = self.enemy.origin - self.origin;
  307.     dist_z = 0;
  308.     
  309.     d = vlen(dist);
  310.     
  311.     if (d < 80)
  312.         return FALSE;
  313.         
  314.     if (d > 150)
  315.         return FALSE;
  316.         
  317.     return TRUE;
  318. };
  319.  
  320. float()     DogCheckAttack =
  321. {
  322.     local vector      vec;
  323.     
  324. // if close enough for slashing, go for it
  325.     if (CheckDogMelee ())
  326.     {
  327.         self.attack_state = AS_MELEE;
  328.         return TRUE;
  329.     }
  330.     
  331.     if (CheckDogJump ())
  332.     {
  333.         self.attack_state = AS_MISSILE;
  334.         return TRUE;
  335.     }
  336.     
  337.     return FALSE;
  338. };
  339.  
  340.  
  341. //===========================================================================
  342.  
  343. /*QUAKED monster_dog (1 0 0) (-32 -32 -24) (32 32 40) Ambush
  344.  
  345. */
  346. void() monster_dog =
  347. {
  348.     if (deathmatch)
  349.     {
  350.         remove(self);
  351.         return;
  352.     }
  353.     precache_model ("progs/h_dog.mdl");
  354.     precache_model ("progs/dog.mdl");
  355.  
  356.     precache_sound ("dog/dattack1.wav");
  357.     precache_sound ("dog/ddeath.wav");
  358.     precache_sound ("dog/dpain1.wav");
  359.     precache_sound ("dog/dsight.wav");
  360.     precache_sound ("dog/idle.wav");
  361.  
  362.     self.solid = SOLID_SLIDEBOX;
  363.     self.movetype = MOVETYPE_STEP;
  364.  
  365.     setmodel (self, "progs/dog.mdl");
  366.  
  367.     setsize (self, '-32 -32 -24', '32 32 40');
  368.     self.health = 25;
  369.  
  370.     self.th_stand = dog_stand1;
  371.     self.th_walk = dog_walk1;
  372.     self.th_run = dog_run1;
  373.     self.th_pain = dog_pain;
  374.     self.th_die = dog_die;
  375.     self.th_melee = dog_atta1;
  376.     self.th_missile = dog_leap1;
  377.  
  378.     self.CanBeShocked = TRUE;
  379.  
  380.     walkmonster_start();
  381. };
  382.